Técnicas para ‘Big Data’ en Economía - Curso 2025/26
Universidad de Alicante
Dpto. de Fundamentos del Análisis Económico. Universidad de Alicante
Un análisis de datos adecuado requiere (mucho) tiempo de trabajo “sucio”
tidyverse incluye una colección de bibliotecas con herramientes eficientes para el proceso de “tratamiento de datos” (“data wrangling”)
El objetivo es tener un conjunto de datos ordenado y limpio para poder realizar análisis de manera eficiente
Esto puede requerir seleccionar columnas, filtrar filas, crear nuevas variables, ordenar, agrupar, resumir, etc.
1.- Cada columna es una variable: mide el mismo atributo entre unidades
2.- Cada fila es una observación (caso): misma unidad a través de atributos
3.- Cada celda es un valor
tidyverse es eficiente con datos ordenadosLa mayoría de operaciones pueden realizarse combinando 5 “verbos”
Todos tienen como primer argumento un data frame, los siguientes describen qué hacer (con columnas o filas) y devuelven otro data frame
1.- select(): selecciona variables por nombres o posiciones de columnas, separados por comas
2.- filter(): conserva filas en las que la condición lógica es verdadera
%>%datos %>% filter(condition) equivale a filter(datos, condition)
10 %>% log() es log(10)El anidamiento es fácil:
presidential y pasarlo a filtrar (produce un nuevo data frame); Atajo de teclado: Cmd / Ctrl + Mays + M
También existe una tubería en R base: |>
3.-mutate(): añade nuevas columnas, creando variables según una fórmula a partir de otras
también rename(): cambiar el nombre de una columna
4.- arrange(): re-ordena las filas todas las columnas de un data frame
desc()5.- summarize(): colapsa valores de un data frame en una sola fila resumen
summarize() suele usarse en conjunción con group_by()group_by()group_by(): cambia el alcance de cada función para que no actúe sobre todo el data frame sino en grupos individuales
¿Cuál es la duración media de los demócratas y de los republicanos? Hacerlo por separado no es eficiente: especificamos que las filas deben ser agrupadas
En Excel: Tablas dinámicas, AGRUPARPOR() (y SUMAR.SI/SUMIF)
ungroup() elimina la agrupación para volver a operar en datos desagrupados
select() para muchas variables usando : y - con nombresTambién funciones como:
starts_with("abc"): nombres que comienzan con “abc”.ends_with("xyz"): nombres que acaban con “xyz”.contains("ijk"): nombres que contienen “ijk”.num_range("x", 1:3): para x1, x2 y x3.matches(): nombres que coinciden con una expresión regularpull(var): extrae una única columna (como vector)slice(), slice_head(), slice_sample(): extraen filas por posición (en lugar de condición) o aleatoriamentedistinct(): extrae sólo las filas únicas (una o varias variables)drop_na() y replace_na(): elimina/reemplaza filas con valores ausentescount(): cuenta los valores únicos de una o más variablesacross(): aplica la misma transformación a múltiples columnasOperadores aritméticos (+, -, *, /, ^, %/%, %%) y lógicos (<, <=, >, >=, !=)
Funciones como log(), lag(), lead(), cumsum(), row_number() etc.
Muchas funciones son equivalentes a otras de R base:
parse_number(), parse_factor(), etc. por as.number(), as.factor(), etc.
bind_cols() y bind_rows() por cbind() y rbind()
if_else(): ejecución condicional por ifelse() (también case_when())
cut_interval(), cut_number(), cut_width()Medidas de centralidad y de dispersión: mean(x), median(x), sd(x), IQR(x)
Medidas de rango: min(x), quantile(x, 0.25), max(x)
Medidas de posición: first(x), nth(x, 2), last(x).
Sumas, productos, etc.
Conteos:
n(): observaciones totales (tamaño del grupo)
sum(!is.na(x)): observaciones no ausentes
n_distinct(x): filas distintas en x
La utilidad de almacenar los datos en un rectángulo ancho (“wide”) o en uno largo (“long”) depende de qué queramos hacer
El cambio de forma entre formatos es una tarea habitual del analista de datos.
Cambiar entre representación larga y ancha se conoce como pivotar (o girar)
pivot_longer(): de ancho a largodata frame a cambiar de forma
nombres o índices de las columnas que representan valores, no variables
los nombres de esas antiguas variables van como valores a nueva variable
los valores de las antiguas celdas van a otra nueva variable
pivot_longer(): de ancho a largo (cont.)pivot_wider(): de largo a anchoseparate(): dividir una columna en múltiples variables indicando un separador o vector de posiciones en las que dividirconvert = TRUE intenta convertir el tipo (no mantener carácter)unite(): combinar múltiples columnas en unaAnalizar datos suele implicar múltiples tablas
diferentes orígenes: ej., dptos. de empresa (personal, ventas, almacén)
almacenamiento más eficiente: elementos “similares” dentro de una tabla y diferentes entre ellas
Para poder combinar la información los datos deben ser relacionales: cada par de tablas están relacionadas mediante identificadores llamados claves
nycflights13 contiene varias tablas: el nombre de la compañía está “codificado” en flights y se puede encontrar en airlinescarrierTipos de claves:
Primaria (o interna): identifican de forma única cada observación en una tabla. Puede ser una sola variable (en planes) o múltiples (en weather)
Secundaria (o externa): señala a la clave primaria de otra tabla
Una clave primaria y una externa (asociada) en otra tabla forman una relación:
Operaciones que se pueden realizar con dos tablas: uniones de transformación, uniones de filtro y operaciones de conjunto
Añaden nuevas variables a una tabla desde filas coincidentes en otra.
cbind() o bind_columns(): nuevas columnas para filas en el mismo ordenby: ¿Cómo se emparejan las tablas?by = "varX" o, para varias, con by = c("varX", "varY")Si se omite el argumento by, se usan todas las variables en común. Esto no siempre es deseable: ej., año no es lo mismo en flights y planes
Columnas con el mismo nombre (ej., año) se desambigúan con un sufijo
by = c("x1" = "y1", "x2" = "y2") para emparejar la variable x1 en la primera tabla con la variable y1 en la segunda, y la variable x2 con y2inner_join(x, y) sólo incluye observaciones que coincidan en x y y.Cuando una fila no coincide en una unión externa, las nuevas variables se rellenan como valores ausentes
left_join(df1, df2): mantiene todas las observaciones en x, coincidan o no con la de y
right_join(df1, df2): mantiene todas las observaciones en y
full_join(df1, df2): incluye todas las observaciones de x e y
Filtra las observaciones de la tabla de la izquierda basándose en si coinciden o no con una observación de la otra tabla
Se tiene un subconjunto de las filas de la tabla de la izquierda
filter(), con tablas previamente resumidas, pero permiten filtrados complejos fácilmenteTrabajan con filas completas, comparando valores de cada variable.
Esperan que x e y tengan las mismas variables, y tratan las observaciones (filas) como elementos de un conjunto.
Útil cuando se quiere dividir un filtro complejo en piezas más simples.
df1 <- tibble(x = 1:2, y = c(1, 1))
df2 <- tibble(x = c(1,1), y = 1:2)
intersect(df1, df2) # solo filas tanto en df1 como en df2
union(df1, df2) # filas únicas en ambas tablas df1 y df2`
union_all(df1, df2) # todas las filas de df1 y df2, manteniendo duplicados
setdiff(df1, df2) # filas en df1, pero no en df2
setdiff(df2, df1)